package models;

import java.util.List;
import java.util.ArrayList;
import siena.Generator;
import siena.Id;
import siena.Query;
import siena.Model;

/**
 * Mediante esta clase se quiere evitar que cuando se elimine un mensaje se borre el contenido que fue compartido con el usuario.
 * Por eso se asocia con el content y luego con el sistema de etiquetas de tag, en lugar de asociar el mensaje directamente con el contenido.
 * 
 * @author Pc
 *
 */
public class ContentTag extends Model {
	
	@Id(Generator.UUID)
	public String id;
	public Long content;
	public Content.ContentType type;
	public Tag tag;
	
	
	public ContentTag(Long c, Content.ContentType typ, Tag t) {
		super();
		id = t.user.id + "-" + c;
		content = c;
		type = typ;
		tag = t;
	}
	
	public static Query<ContentTag> all() {
		return all(ContentTag.class);
	}
	
	public  static Query<ContentTag> allByContent(Long content) {
		return all().filter("content", content);
	}
	
	public static Query<ContentTag> allByTag(Tag tag) {
		return all().filter("tag", tag);
	}
	
	public static int countByTag(Tag tag) {
		return allByTag(tag).count();
	}
	
	public static boolean exists(Long content, Tag tag) {
		Query<ContentTag> contentTags = allByTag(tag);
		for(ContentTag contentTag : contentTags.fetch()) {
			System.out.println("ContentID: " + contentTag.content);
		}
		return allByTag(tag).filter("content", content).fetch().size()>0;
	}
	
	public  static <T extends Content> List<T> paginateByTag(Content.ContentType type, Query<ContentTag> contentTags, int offset, int limit) {
		List<T> contents = new ArrayList<T>();
		for(ContentTag contentTag : contentTags.filter("type", type).fetch(limit, offset)) {
			contents.add((T) Content.findById(Photo.class, contentTag.content));
		}
		return contents;
	}
	
	
	public static List<Tag> findTagsByContent(Query<ContentTag> query, int offset, int limit) {
		List<ContentTag> contentTags = query.fetch(limit, offset);
		List<Tag> tags = new ArrayList<Tag>();
		for(ContentTag contentTag : contentTags) {
			tags.add(Tag.findById(contentTag.tag.id));
		}
		return tags;
	}	

}